package kr.co.bettersoft.waitnumberstorem.activity;

import java.util.ArrayList;
import java.util.List;

import kr.co.bettersoft.waitnumberstorem.activity.PullToRefreshListView.OnRefreshListener;
import kr.co.bettersoft.waitnumberstorem.adapter.TodayUserListAdapter;
import kr.co.bettersoft.waitnumberstorem.common.CommonConstant;
import kr.co.bettersoft.waitnumberstorem.common.WaitnumberStoreMRest;
import kr.co.bettersoft.waitnumberstorem.domain.WaitingNumberStore;
import kr.co.bettersoft.waitnumberstorem.domain.WaitingUser;
import kr.co.bettersoft.waitnumberstorem.fragment.FragmentHome;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.graphics.Typeface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

/**
 * MainSettingsTodayUserListActivity
 * 금일 방문 고객 리스트(입장인원)
 * @author blue
 *
 */
public class MainSettingsTodayUserListActivity extends Activity{			
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 변수
		String TAG = "MainSettingsTodayUserListActivity";

		public final int SELECT_TODAY_ADMISSION_USER_LIST = 801; 			// 대기 목록을 가져온다. 그리고 입장모드일 경우 위에서 가져온 totalCount 정보에 따라 입장 처리도 함.  
		
		// 폰트
		private Typeface typefaceNanumGothic= null; 
		private Typeface typefaceNanumGothicBold = null;
		
		SharedPreferences sharedPrefCustom;	// 공용 프립스	

		// 프래그먼트 종료 여부. 종료된 경우 스레드 호출로 인한 에러를 방지하기 위함
		Boolean isFinished = false;
		
		// 서버 통신용
		static Boolean countOne = true;		// 한번에 한번만 통신 하도록
		WaitnumberStoreMRest waitnumberStoreMRest;
		String callResult = "";
//		String tempstr = "";
		JSONObject jsonObject;
		
		// 데이터
		String resultStr;		// 요청 결과
		
		static String merchantId = "";	//	// 전달받은 가맹점 정보

		// 서버에서 받은 대기 인원 리스트 임시 저장
		int max = 0;
		String tmpIdWaitingUsers = "";
		String tmpUserName = "";
		String tmpQrCode = "";
		String tmpPhoneNumber = "";
		String tmpNumberWaiting = "";
		String tmpCompanion = "";
		String tmpAdmissionYn = "";
		String tmpNextTurnYn = "";
		String tmpActivateYn = "";
		String tmpModifyDate = "";
		String tmpRegisterDate = "";
		
		// 대기인원 리스트
		public ArrayList<WaitingUser> entries1 = new ArrayList<WaitingUser>();
		List<WaitingUser> entriesFn = new ArrayList<WaitingUser>();				
		
		private TodayUserListAdapter waitingUserListAdapter;		// 그리드뷰 사용할 아답터

		// 화면 구성
		TextView titleBar;		// 타이틀
		Button closeBtn;
//		TextView mainHomeWaitUserNumberTotal;		// 금일 총 방문자수	 
//		TextView mainWaitStatusWaitTeamTotal;		// 금일 총 방문팀수 
		
		// 대기리스트
		ListView userListView;
		View emptyView;				// 데이터 없음 뷰
		
		ProgressBar pb1;		// 중단 로딩 진행바

		// pull down refresh
		Boolean pullDownRefreshIng  = false;
		
	////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		// 핸들러
		Handler handler = new Handler(){
			@Override
			public void handleMessage(Message msg){
				try{
					Bundle b = msg.getData();		
					
					if(b.getInt("showToast")==1){		// 화면에 토스트 띄우기
						Toast.makeText(returnThis(), b.getString("msg"), Toast.LENGTH_SHORT).show();
					}
					if(b.getInt("showAlert")==1){					 // 경고창 . 
						//
						new AlertDialog.Builder(returnThis())
						.setTitle(CommonConstant. alertTitle )                                        
						.setMessage(b.getString("msg"))
						.setIcon(R.drawable.ic_dialog_img)		
						.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
							public void onClick(DialogInterface dialog, int whichButton) {
								// 단순 확인 용도
							}})
							.setNegativeButton("", null).show();
					}
					
					if(b.getInt("showListYN")==1){
						// 대기 목록 데이터를 화면에.. 
						if((entriesFn!=null)&&(entriesFn.size()>0)){
								setGriding();			// 항시 업뎃
							userListView.setVisibility(View.VISIBLE);
							emptyView.setVisibility(View.GONE);
						}else{
							Log.d(TAG,"no data");
							userListView.setEmptyView(emptyView);
							userListView.setVisibility(View.GONE);
							emptyView.setVisibility(View.VISIBLE);
						}						
					}
					
//					// 금일 총인원 보여줌 
//					if(b.getInt("showTodayTotalCount")==1){
//						mainHomeWaitUserNumberTotal.setText(todayTotalCount);		// ### 보류
//						mainWaitStatusWaitTeamTotal.setText(todayTotalTeam+"");		// ### 보류
//					}
					
					if(b.getInt("order")==1){
						// 프로그래스바 실행
						pb1.setVisibility(View.VISIBLE);
					}else if(b.getInt("order")==2){
						// 프로그래스바  종료
						pb1.setVisibility(View.GONE);
					}
					
					switch (msg.what)
					{
						case SELECT_TODAY_ADMISSION_USER_LIST : 		//  
							if(returnThis()!=null) {
								runOnUiThread(new RunnableSelectTodayAdmissionUserList());		
							}
							break;	
						default : 
							break;
					}
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		};

		/**
		 * setGriding
		 * 데이터를 화면에 세팅한다
		 *
		 * @param 
		 * @param 
		 * @return 
		 */
		public void setGriding(){
			waitingUserListAdapter = new TodayUserListAdapter(returnThis(), entriesFn);
			userListView.setAdapter(waitingUserListAdapter);
		}
		
		//////////////////////////////////////////////////////////////////////////////////////////////////////
		
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		@Override
		public void onCreate(Bundle savedInstanceState) {
			super.onCreate(savedInstanceState);

			requestWindowFeature(Window.FEATURE_NO_TITLE );	// 타이틀바 제거
			setContentView(R.layout.main_settings_tody_user_list_activity);

			waitnumberStoreMRest = new WaitnumberStoreMRest();
			
			titleBar = (TextView) findViewById(R.id.title_bar);
//			todayVisitCount = (TextView) findViewById(R.id.today_visit_count);
//			todayVisitTeam = (TextView) findViewById(R.id.today_visit_team);
		    
			
			userListView = (ListView) findViewById(R.id.user_list_view);		
			emptyView = findViewById(R.id.empty1);		// 데이터 없으면 '빈 페이지'(데이터 없음 메시지)표시
			
			pb1=(ProgressBar) findViewById(R.id.progressbar1);
			
			// 가맹점 아이디를 꺼낸다.
			sharedPrefCustom = returnThis().getSharedPreferences(CommonConstant.prefName,
					Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
			merchantId = sharedPrefCustom.getString("merchantId", "");
			
			// 하단 닫기버튼, 리스너
			closeBtn = (Button)findViewById(R.id.close_btn);
			closeBtn.setOnClickListener(new Button.OnClickListener()  {
				public void onClick(View v)  {
					finish();
				}
			});	
			
		    
			
			// 폰트 지정.
		    typefaceNanumGothic = Typeface.createFromAsset(returnThis().getAssets(), CommonConstant.NanumGothic);  
		    typefaceNanumGothicBold = Typeface.createFromAsset(returnThis().getAssets(), CommonConstant.NanumGothicBold);
		    // 폰트 적용
		    titleBar.setTypeface(typefaceNanumGothic);	
//		    todayVisitCount.setTypeface(typefaceNanumGothic);	
//		    todayVisitTeam.setTypeface(typefaceNanumGothic);	
		    closeBtn.setTypeface(typefaceNanumGothic);
		    
		    
			////////////////////////////////pull down list
			// Set a listener to be invoked when the list should be refreshed.
	        ((PullToRefreshListView) userListView).setOnRefreshListener(new OnRefreshListener() {
	            @Override
	            public void onRefresh() {
	                // Do work to refresh the list here.
	            	if(countOne){
		    			countOne = false;		
		    				try {
		    					pullDownRefreshIng = true;				// 기본 로딩바는 보여주지 않기 위함
		    					new GetDataTask().execute();
		    				}catch (Exception e) {
		    					e.printStackTrace();
		    				} 
		    		}else{
		    			Log.d(TAG,"already running..");		 
		    			((PullToRefreshListView) userListView).onRefreshComplete();
		    		}
	                
	            }
	        });
	        
	        if(countOne){
				countOne = false;		
				handler.sendEmptyMessage(SELECT_TODAY_ADMISSION_USER_LIST);  
			}else{
				Log.d(TAG,"already running..");		 
			}
	        
		}


		
//	//////////////////////////////////////////////////////////////////////////////////////////////////////
		// pull down list
			
			private class GetDataTask extends AsyncTask<Void, Void, String[]> {
		        @Override
		        protected String[] doInBackground(Void... params) {
		            // Simulates a background job.
		        	Log.d(TAG,"GetDataTask");
		        	
						// 파라미터 세팅
		        	WaitingNumberStore waitingNumberStore = new WaitingNumberStore();
						waitingNumberStore.setMerchantId(merchantId);
						
						// 서버 메소드 호출
						if(FragmentHome.restCallCntUp()){
							if(!isFinished){
								// 대기 목록
								callResult = waitnumberStoreMRest.RestSelectTodayAdmissionUserList(waitingNumberStore);
								
								// 결과 처리
								if(!(callResult.equals("F"))){
//									tempstr = waitnumberStoreMRest.getTempstr();
									processTodayUserListData(callResult);
								}
							}
							FragmentHome.restCallCntDown();
						}
						try {
							threadShowList();
						} catch (Exception e) {
							e.printStackTrace();
						}
					countOne = true;		// 다시 호출 되도록 수정..	
		            return null;
		        }
		        @Override
		        protected void onPostExecute(String[] result) {
		            // Call onRefreshComplete when the list has been refreshed.
		        	pullDownRefreshIng = false;							// 기본 로딩바 보여주기 상태 초기화. resume 기능으로는 보여지도록.
		            ((PullToRefreshListView) userListView).onRefreshComplete();		// 리프레시가 끝났음을....
		            super.onPostExecute(result);
		        }
		    }
		
		
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
		
		
		/**
		 * 러너블.  
		 */
		class RunnableSelectTodayAdmissionUserList implements Runnable {
			public void run(){
				new backgroundThreadSelectTodayAdmissionUserList().execute();
			}
		}
		/**
		 * backgroundThreadSelectTodayAdmissionUserList
		 * 비동기 스레드.   
		 * @author blue
		 */
		public class backgroundThreadSelectTodayAdmissionUserList extends AsyncTask<Void, Void, Void>{
			@Override protected void onPostExecute(Void result) {  
			} 
			@Override protected void onPreExecute() {  
			} 
			@Override protected Void doInBackground(Void... params) {  
				Log.d(TAG,"backgroundThreadSelectTodayAdmissionUserList");
				
				// 파라미터 세팅
				WaitingNumberStore waitingNumberStore = new WaitingNumberStore();
				waitingNumberStore.setMerchantId(merchantId);
				
				// 서버 메소드 호출
				if(FragmentHome.restCallCntUp()){
					showPb();	// 진행중이니까 자연스럽게.
					if(!isFinished){
						// 대기 목록
						callResult = waitnumberStoreMRest.RestSelectTodayAdmissionUserList(waitingNumberStore);
						// 결과 처리
						if(!(callResult.equals("F"))){
							processTodayUserListData(callResult);
						}
					}
					FragmentHome.restCallCntDown();
				}
				countOne = true;		// 다시 호출 되도록 수정..	
				return null; 
			}
		}
		
		/**
		 *  스레드를 사용하여 화면에 대기리스트 보여준다  + 최근 입장 인원 출력 기능도 함께 수행
		 */
		public void threadShowList() throws Exception{
			if(returnThis()!=null){
				runOnUiThread(new Runnable(){		 
					@Override
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						b.putInt("showListYN", 1);		// 보여주기.
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
		}
	///////////////////////////////////////////////////////////////////////////////////////////////////////
		
		/**
		 * 서버로부터 받아온 목록 데이터를 처리하여 화면에 보여준다.
		 */
		public void processTodayUserListData(String callResult){
			try {
				// 데이터 세팅부..
//				tempstr = waitnumberStoreMRest.getTempstr();
				Log.d(TAG,"processTodayUserListData callResult:"+callResult);
				JSONArray jsonArray = null;
				jsonArray = new JSONArray(callResult);
				max = jsonArray.length();
				
				
				
				
				
				
				
				
				
				
				
				
				

				
				
				if(max>0){
					entries1 = new ArrayList<WaitingUser>(max);
					for ( int i = 0; i < max; i++ ){
						JSONObject jsonObj;
						try {
							jsonObj = jsonArray.getJSONObject(i);	
							String tmpRegisterDate2 = "";	// 형식 변환해서 저장용
							int dayOfRegisterDate = 0;	// 오전 오후 분간용
							String dayOfRegisterDateStr = "";	// 다시 문자형 시간으로 변환해서 저장(2자리 유지하기 위함)
							String strAMPM = "";
							try{
								tmpIdWaitingUsers =jsonObj.getString("idWaitingUsers");
							}catch(Exception e){
								tmpIdWaitingUsers = "";
							}
							try{
								tmpUserName =jsonObj.getString("userName");
							}catch(Exception e){
								tmpUserName = "";
							}
							try{
								tmpQrCode =jsonObj.getString("qrCode");
							}catch(Exception e){
								tmpQrCode = "";
							}
							try{
								tmpPhoneNumber =jsonObj.getString("phoneNumber");
							}catch(Exception e){
								tmpPhoneNumber = "";
							}
							try{
								tmpNumberWaiting =jsonObj.getString("numberWaiting");
							}catch(Exception e){
								tmpNumberWaiting = "";
							}
							try{
								tmpCompanion =jsonObj.getString("companion");
							}catch(Exception e){
								tmpCompanion = "";
							}
							try{
								tmpAdmissionYn =jsonObj.getString("admissionYn");
							}catch(Exception e){
								tmpAdmissionYn = "";
							}
							try{
								tmpNextTurnYn =jsonObj.getString("nextTurnYn");
							}catch(Exception e){
								tmpNextTurnYn = "";
							}
							try{
								tmpActivateYn =jsonObj.getString("activateYn");
							}catch(Exception e){
								tmpActivateYn = "";
							}
							try{
								tmpRegisterDate =jsonObj.getString("registerDate");
								// 길면 자르기
								if(tmpRegisterDate!=null &&(tmpRegisterDate.length()>19)){
									tmpRegisterDate = tmpRegisterDate.substring(0, 19);		// 2013-05-15 15:21:25  -> 초까지 나옴
								}
								
								// 오전 오후 분간하기
								dayOfRegisterDate = Integer.parseInt(tmpRegisterDate.substring(11, 13));	// dayOfRegisterDate
								if(dayOfRegisterDate>11){		// 12시 넘었을때 = 오후
									dayOfRegisterDate = dayOfRegisterDate - 12;
									strAMPM = returnThis().getString(R.string.pm_of_day)+"";
								}else{				// 12시 이전 = 오전
									strAMPM = returnThis().getString(R.string.am_of_day)+"";
								}
								
								// 두자리로 맞추기.
								dayOfRegisterDateStr = Integer.toString(dayOfRegisterDate);
								if(dayOfRegisterDate<10){		
									dayOfRegisterDateStr = "0"+dayOfRegisterDateStr;
								}
								
//								// 원하는 날짜 형식에 맞춰서 데이터 넣기
//								tmpRegisterDate2 = tmpRegisterDate.substring(0, 4)+returnThis().getString(R.string.year) +tmpRegisterDate.substring(5, 7) + returnThis().getString(R.string.month) + tmpRegisterDate.substring(8, 10) + returnThis().getString(R.string.day) + " " + strAMPM + " " + dayOfRegisterDateStr + tmpRegisterDate.substring(13);
								
								// 원하는 날짜 형식에 맞춰서 데이터 넣기
								tmpRegisterDate2 = 
									tmpRegisterDate.substring(0, 4)+getString(R.string.year) 
									+tmpRegisterDate.substring(5, 7) + getString(R.string.month) 
									+tmpRegisterDate.substring(8, 10) + getString(R.string.day) 
									+ " " + strAMPM + " " 
									+dayOfRegisterDateStr + getString(R.string.hour) 
									+tmpRegisterDate.substring(14, 16) + getString(R.string.minute) 
									+tmpRegisterDate.substring(17, 19) + getString(R.string.seconds);
//									+tmp_registerDate.substring(13);
								tmpRegisterDate = tmpRegisterDate2;	
							}catch(Exception e){
								tmpRegisterDate2 = "";
							}
							try{
								tmpModifyDate =jsonObj.getString("modifyDate");
							}catch(Exception e){
								tmpModifyDate = "";
							}
							entries1.add(
									new WaitingUser(
											tmpIdWaitingUsers,
											tmpUserName,
											tmpQrCode,		
											tmpPhoneNumber,
											tmpNumberWaiting,
											tmpCompanion,
											tmpAdmissionYn, 
											tmpNextTurnYn,
											tmpActivateYn,
											tmpRegisterDate2,
											tmpModifyDate
									)
							);
						} catch (JSONException e) {
							e.printStackTrace();
						} 
					}
					entriesFn = entries1;
				}else{		// 데이터 없음.
					entriesFn = null;
				}
				try {
					hidePb();
					threadShowList();
				} catch (Exception e) {
					e.printStackTrace();
				}
			} catch (JSONException e) {
				e.printStackTrace();
			} 
			countOne = true;
		}
		
		////////////////////////	Util	///////////////////////////////////////////////////////////////////////	
		/**
		 * returnThis
		 *  컨택스트 리턴한다
		 *
		 * @param
		 * @param
		 * @return
		 */
		public Context returnThis(){
			return this;
		}

		/*
		 * 핸들러를 통한 작업.
		 */
		/**
		 * showMsg
		 *  화면에 토스트 띄움 msg 변수에 내용을 넣어서 호출하면 화면에 토스트를 띄운다.
		 *
		 * @param msg
		 * @param
		 * @return
		 */
		public void showMsg(final String msg){		
			if(returnThis()!=null){
				runOnUiThread(new Runnable(){	 
					@Override
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showToast", 1);
						b.putString("msg", msg);
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
		} 

		/**
		 * showResultDialog
		 *  얼럿 띄운다
		 *
		 * @param msg
		 * @param
		 * @return 
		 */
		public void showResultDialog(final String msg){
			if(returnThis()!=null){
				runOnUiThread(new Runnable(){	 
					@Override
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showAlert", 1);
						b.putString("msg", msg);			// 화면에 보여줄 메시지
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
		}
		// 확인을 받는 컨펌 창을 띄운다
		/**
		 * showConfirmDialog
		 *  확인을 받는 컨펌 창을 띄운다
		 *
		 * @param showConfirmCode
		 * @param msg
		 * @return 
		 */
		public void showConfirmDialog(final int showConfirmCode, final String msg){
			if(returnThis()!=null){
				runOnUiThread(new Runnable(){		 
					@Override
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showConfirm", showConfirmCode);		 
						b.putString("msg", msg);			// 화면에 보여줄 메시지
						message.setData(b);
						handler.sendMessage(message);
					}
				});
			}
		}

		// 중앙 프로그래스바 보임, 숨김
		/**
		 * showPb
		 *  중앙 프로그래스바 가시화한다
		 *
		 * @param
		 * @param
		 * @return
		 */
		public void showPb(){
			new Thread( 
					new Runnable(){
						public void run(){
							Message message = handler .obtainMessage();
							Bundle b = new Bundle();
							b.putInt( "order" , 1);
							message.setData(b);
							handler .sendMessage(message);
						}
					}
			).start();
		}
		/**
		 * hidePb
		 *  중앙 프로그래스바 비가시화한다
		 *
		 * @param
		 * @param
		 * @return
		 */
		public void hidePb(){
			new Thread(
					new Runnable(){
						public void run(){
							Message message = handler .obtainMessage();
							Bundle b = new Bundle();
							b.putInt( "order" , 2);
							message.setData(b);
							handler .sendMessage(message);
						}
					}
			).start();
		}

		/**
		 * onResume
		 *  액티비티 리쥼시 닫기 카운터초기화한다
		 *
		 * @param
		 * @param
		 * @return
		 */
		@Override
		public void onResume(){
			super.onResume();
			isFinished = false;
		}
		@Override
		public void onPause(){
			super.onPause();
			isFinished = true;
		}
	}
